using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Collections;

namespace Sinacor.Infra.Common
{
    /// <summary>
    /// Classe base para tradutores de objetos
    /// </summary>
    /// <typeparam name="TTo">Type do objeto de destino</typeparam>
    /// <typeparam name="TFrom">Type do objeto de origem</typeparam>
    /// <typeparam name="TListTo">Type da lista de objetos de destino</typeparam>
    /// <typeparam name="TListFrom">Type da lista de objetos de origem</typeparam>
    public abstract class BaseTranslator<TTo, TFrom, TListTo, TListFrom>
        where TListTo : IList<TTo>, new()
        where TListFrom : IList<TFrom>, new()
    {
        /// <summary>
        /// Traduz o objeto de origem para o objeto de destino
        /// </summary>
        /// <param name="from">Objeto de origem</param>
        /// <returns>Objeto de destino</returns>
        public abstract TTo Translate(TFrom from);

        ///// <summary>
        ///// Traduz o objeto de destino para o objeto de origem
        ///// </summary>
        ///// <param name="from">Objeto de origem</param>
        ///// <returns>Objeto de destino</returns>
        //public abstract TFrom Translate(TTo from);


        /// <summary>
        /// Traduz uma lista de objetos de origem para uma lista de objetos de destino
        /// </summary>
        /// <param name="from">Objetos de origem</param>
        /// <returns>Objetos de destino</returns>
        public TListTo TranslateToList(TListFrom from)
        {
            TListTo to = default(TListTo);
            if (from != null)
            {
                to = new TListTo();
                foreach (TFrom item in from)
                {
                    to.Add(Translate(item));
                }
            }
            return to;
        }

        ///// <summary>
        ///// Traduz uma lista de objetos de origem para uma lista de objetos de destino
        ///// </summary>
        ///// <param name="from">Objetos de origem</param>
        ///// <returns>Objetos de destino</returns>
        //public TListFrom TranslateToList(TListTo to)
        //{
        //    TListFrom from = default(TListFrom);
        //    if (to != null)
        //    {
        //        from  = new TListFrom();
        //        foreach (TTo item in to)
        //        {
        //            from.Add(Translate(item));
        //        }
        //    }
        //    return from;
        //}

    
    }
}